/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.form;
import java.beans.*;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Vector;
import java.util.StringTokenizer;
/** A class that manages events for one RADComponent.
*
* @author Ian Formanek
*/
final public class EventsList extends Object {
/** The handler property name */
public static final String PROP_HANDLER = "handler"; // NOI18N
protected static FormLoaderSettings formSettings = new FormLoaderSettings ();
// FINALIZE DEBUG METHOD
public void finalize () throws Throwable {
super.finalize ();
if (System.getProperty ("netbeans.debug.form.finalize") != null) {
System.out.println("finalized: "+this.getClass ().getName ()+", instance: "+this); // NOI18N
}
} // FINALIZE DEBUG METHOD
/** Constructs a new EventsList for specified RADComponent.
* @param component The RADComponent for which this class manages the events
*/
EventsList (RADComponent component) {
radComponent = component;
eventsManager = radComponent.getFormManager ().getEventsManager ();
BeanInfo beanInfo = radComponent.getBeanInfo ();
EventSetDescriptor[] eventSets = beanInfo.getEventSetDescriptors ();
ArrayList list = new ArrayList (eventSets.length);
for (int i = 0; i < eventSets.length; i++) {
list.add (new EventSet (eventSets[i]));
}
if (formSettings.getSortEventSets ()) {
// if the event sets are to be sorted, sort them out and move
// the default event set to the beginning
Collections.sort (list, new Comparator () {
public int compare(Object o1, Object o2) {
String n1 = ((EventSet)o1).getName();
String n2 = ((EventSet)o2).getName();
return n1.compareTo(n2);
}
}
);
}
eventSetHandlers = new EventSet [list.size ()];
list.toArray (eventSetHandlers);
}
/** A setter for preserveEmptyHandlers property.
* If this property is set to false (default), the user is asked when the last event is
* deattached froman event handler, if true, the handlers are preserved even if oe events
* are attached to it.
*/
public void setPreserveEmptyHandlers (boolean value) {
preserveEmptyHandlers = value;
}
/** A getter for preserveEmptyHandlers property.
* If this property is set to false (default), the user is asked when the last event is
* deattached froman event handler, if true, the handlers are preserved even if oe events
* are attached to it.
*/
public boolean getPreserveEmptyHandlers () {
return preserveEmptyHandlers;
}
/** @return an array of all EventSets for this component */
public EventSet[] getEventSets () {
return eventSetHandlers;
}
/** @return the Event that represents the default event or null if there is
* no default event.
*/
public Event getDefaultEvent () {
BeanInfo beanInfo = radComponent.getBeanInfo ();
int defIndex = beanInfo.getDefaultEventIndex ();
if (defIndex == -1) {
for (int i = 0; i < eventSetHandlers.length; i++) {
if ("action".equals (eventSetHandlers[i].getName ())) { // NOI18N
Event[] events = eventSetHandlers[i].getEvents ();
for (int j = 0; j < events.length; j++) {
if ("actionPerformed".equals (events[j].getName ())) // NOI18N
return events[j];
}
}
}
} else {
int counter = 0;
for (int i = 0; i < eventSetHandlers.length; i++) {
Event[] events = eventSetHandlers[i].getEvents ();
for (int j = 0; j < events.length; j++) {
if (counter == defIndex)
return events[j];
counter++;
}
}
}
return null;
}
/** @return an array of all event handler names */
public int getEventCount () {
int count = 0;
for (int i = 0; i < eventSetHandlers.length; i++)
count += eventSetHandlers[i].getEventCount ();
return count;
}
/** Initializes the names of event handlers for all events
* @param eventHandlerNames The mapping <String, String> of event name to event handler name
*/
void initEvents (Hashtable eventHandlerNames) {
for (int i = 0; i < eventSetHandlers.length; i++) {
Event[] events = eventSetHandlers[i].getEvents ();
for (int j = 0; j < events.length; j++) {
if (eventHandlerNames.get (events[j].getName ()) != null) {
StringTokenizer st = new StringTokenizer ((String)eventHandlerNames.get (events[j].getName ()), ","); // NOI18N
while (st.hasMoreTokens()) {
String handlerName = st.nextToken();
eventsManager.addEventHandler (events[j], handlerName);
}
}
}
}
}
/** @return the array of all event handler names */
Hashtable getEventNames () {
Hashtable names = new Hashtable (20);
for (int i = 0; i < eventSetHandlers.length; i++) {
Event[] events = eventSetHandlers[i].getEvents ();
for (int j = 0; j < events.length; j++) {
Vector handlers = events[j].getHandlers ();
String eventName = events[j].getName ();
String hanlerNames = ""; // NOI18N
if (handlers.size() > 0) {
String handlerNames = ((EventsManager.EventHandler) handlers.get (0)).getName ();
for (int k=1, n=handlers.size(); k<n; k++)
handlerNames = handlerNames + ","+((EventsManager.EventHandler) handlers.get (k)).getName (); // NOI18N
names.put (eventName, handlerNames);
}
}
}
return names;
}
// -----------------------------------------------------------------------------
// innerclasses
/** A class that represents one EventSet */
final public class EventSet {
EventSet (EventSetDescriptor desc) {
this.desc = desc;
Method[] methods = desc.getListenerMethods ();
events = new Event[methods.length];
for (int i = 0; i < methods.length; i++)
events [i] = new Event (methods [i]);
}
public Event[] getEvents () {
return events;
}
public int getEventCount () {
return events.length;
}
public String getName () {
return desc.getName ();
}
EventSetDescriptor getEventSetDescriptor () {
return desc;
}
private EventSetDescriptor desc;
private Event[] events;
}
/** A class that represents one event handler.
* It provides a support for listening to property changes.
*/
final public class Event {
/** Constructs a new Event for the specified event method.
* @param m The Event method that is to be represented by this Event
*/
Event (Method m) {
listenerMethod = m;
}
public String getName () {
return listenerMethod.getName ();
}
public Method getListenerMethod () {
return listenerMethod;
}
public void addHandler (EventsManager.EventHandler handler) {
eventHandlers.add (handler);
propertySupport.firePropertyChange (PROP_HANDLER, null, handler);
}
public void removeHandler (EventsManager.EventHandler handler) {
eventHandlers.remove (handler);
propertySupport.firePropertyChange (PROP_HANDLER, handler, null);
}
public Vector getHandlers () {
return eventHandlers;
}
public void addPropertyChangeListener (PropertyChangeListener pcl) {
propertySupport.addPropertyChangeListener (pcl);
}
public void removePropertyChangeListener (PropertyChangeListener pcl) {
propertySupport.removePropertyChangeListener (pcl);
}
public void createDefaultEventHandler () {
eventsManager.addEventHandler (this, FormUtils.getDefaultEventName (radComponent, listenerMethod));
radComponent.getFormManager ().fireEventAdded (radComponent, (EventsManager.EventHandler) eventHandlers.get (eventHandlers.size() -1));
String newHandlerName = ((EventsManager.EventHandler) eventHandlers.get (eventHandlers.size() -1)).getName();
radComponent.getNodeReference ().firePropertyChangeHelper (FormEditor.EVENT_PREFIX + getName(), null, newHandlerName);
}
public void gotoEventHandler () {
if (eventHandlers.size() == 1)
radComponent.getFormManager ().getCodeGenerator ().gotoEventHandler (((EventsManager.EventHandler) eventHandlers.get (0)).getName ());
//PBUZEK >1 display
}
public void gotoEventHandler (String handlerName) {
EventsManager.EventHandler handler = null;
for (int i=0, n=eventHandlers.size(); i<n; i++)
if (((EventsManager.EventHandler) eventHandlers.get (i)).getName ().equals (handlerName)) {
handler = (EventsManager.EventHandler) eventHandlers.get (i);
break;
}
if (handler != null) {
radComponent.getFormManager ().getCodeGenerator ().gotoEventHandler (handler.getName ());
}
}
void nameChanged () {
propertySupport.firePropertyChange (null, null, null);
}
boolean preserveEmptyEvent () {
return getPreserveEmptyHandlers ();
}
/** The PropertyChange support */
private PropertyChangeSupport propertySupport = new PropertyChangeSupport (this);
/** The event handler methods or null if not specified. Members are EventsManager.EventHandler
* @associates EventHandler*/
private Vector eventHandlers = new Vector ();
private Method listenerMethod;
//private Vector handlerNames = new Vector (); // String members
}
RADComponent getRADComponent () {
return radComponent;
}
EventsManager getEventsManager () {
return eventsManager;
}
// -----------------------------------------------------------------------------
// private area
private RADComponent radComponent;
private EventsManager eventsManager;
private EventSet[] eventSetHandlers;
private boolean preserveEmptyHandlers = false;
}
/*
* Log
* 11 Gandalf 1.10 1/14/00 Pavel Buzek fire property change
* when creating new event handler
* 10 Gandalf 1.9 1/5/00 Ian Formanek NOI18N
* 9 Gandalf 1.8 11/25/99 Pavel Buzek support for multiple
* handlers for one event
* 8 Gandalf 1.7 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 7 Gandalf 1.6 8/1/99 Ian Formanek access modifiers cleaned
* 6 Gandalf 1.5 7/30/99 Ian Formanek Fixed bug 2814 - Adding
* events handler failed.
* 5 Gandalf 1.4 6/28/99 Ian Formanek Reemoved obsoleted class
* EventMapper
* 4 Gandalf 1.3 5/17/99 Ian Formanek Events are sorted
* 3 Gandalf 1.2 5/15/99 Ian Formanek
* 2 Gandalf 1.1 5/12/99 Ian Formanek
* 1 Gandalf 1.0 5/10/99 Ian Formanek
* $
*/